powershell 批量转换文本文件编码(GBK转UTF

您所在的位置:网站首页 陈氏太极二十四式教学 24式太极扇 powershell 批量转换文本文件编码(GBK转UTF

powershell 批量转换文本文件编码(GBK转UTF

2023-11-19 15:13| 来源: 网络整理| 查看: 265

powershell 批量转换文本文件编码(GBK转UTF-8) 01 前言02 正文1. 2023-06-11 13:26 更新 03 后记

01 前言

手头有一批SQL文件,通过某程序批量更新到Local DB。但是发现导进去后中文变乱码(一堆????),而且日志里头insert语句中文已经变成乱码,想来应该是编码的问题。一看SQL文件,GBK(系统默认编码)编码,于是想统一改成UTF-8编码。又不想去找各种工具了,直接用Powershell搞搞了。

02 正文

刚开始直接用powershell的内置命令get-content 和 set-content是挺方便的,但是结果一看,GBK转到了UTF-8 BOM 编码,不是很满意。但是也贴出来作为参考吧。

@echo off powershell.exe -command "dir *.sql -R|foreach-object{(Get-Content $_.FullName -Encoding Default) | Set-Content $_.FullName -Encoding UTF8 };Write-Host 'Success...'" pause

于是想到另外一个方法——.net。最后得到想要的UTF-8编码。

@echo off powershell.exe -command "dir *.sql -R|foreach-object{[void][System.IO.File]::WriteAllBytes($_.FullName,[System.Text.Encoding]::Convert([System.Text.Encoding]::GetEncoding('GBK'),[System.Text.Encoding]::GetEncoding('UTF-8'),[System.IO.File]::ReadAllBytes($_.FullName)))};Write-Host 'Success...'" pause

脚本使用说明

脚本在powershell 5.1下测试通过powershell脚本嵌入了CMD命令,所以另存为.bat,然后双击运行即可(递归遍历所有子目录,如果不需要,请将dir *.sql -R修改为dir *.sql)如果是其他文本格式如csv或txt,请将脚本中dir *.sql修改为dir *.csv 或 dir *.txt其他编码转换也可参考,做适当修改即可该脚本如果执行成功(不报错),请勿重复执行!否则可能会造成真的乱码。 1. 2023-06-11 13:26 更新

针对大文件的版本:

@echo off title Encoding Converter REM 指定的一种文件类型(只支持一类) set fileType=*.sql REM 是否遍历子目录:需要遍历则设置为:-Recurse,否则置为空 REM set isRecurse= set isRecurse=-Recurse REM 转换前的文件编码 set fromEnc=GBK REM 转换后的文件编码 set toEnc=UTF-8 REM 转换后的文件名前缀,默认与转换的文件在同一目录,不能为空 set prefix=temp_ powershell.exe -command "$files = dir %fileType% %isRecurse%; $prefix = '%prefix%'; $from = '%fromEnc%'; $to = '%toEnc%'; $e = [System.Text.Encoding]; $sr = [System.IO.StreamReader]; $sw = [System.IO.StreamWriter]; function getEnc($encName){if('UTF-8' -eq $encName.ToUpper()){return [System.Text.UTF8Encoding]::new($false);}return [System.Text.Encoding]::GetEncoding($encName); }; if($files.Count -lt 1){Write-Host 'No Files...';exit; }; Write-Host ('Begin:'+(Get-Date -Format 'yyyy-MM-dd HH:mm:ss'));foreach($file in $files){$newFile = (Join-Path -Path $file.DirectoryName -ChildPath ($prefix+$file.BaseName+$file.Extension));$srIn = $sr::new($file.FullName,(getEnc -encName $from));$swOut = $sw::new($newFile,$false,(getEnc -encName $to),4096);while(($line = $srIn.ReadLine()) -ne $null){$swOut.WriteLine($line);}$srIn.Close();$swOut.Flush();$swOut.Close(); }; Write-Host ('Files:'+$files.Count+',success...');Write-Host ('End:'+(Get-Date -Format 'yyyy-MM-dd HH:mm:ss'));" pause

脚本使用说明

另存为.bat,然后双击运行即可相关参数根据需要修改 03 后记

欢迎留言交流~ ---------END---------



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3